#include "GeneradorPlanDeCarrera.h"

using namespace modelo;

GeneradorPlanDeCarrera::GeneradorPlanDeCarrera(ContextoDeEjecucion* contexto)
{
	this->priorizadorMaterias = new PriorizadorMateriasFIUBA(contexto);
	this->contexto = contexto;
	this->aplicadorRestriccionesDeterministicas = new AplicadorRestriccionesDeterministicas(this->contexto);
	this->aplicadorRestriccionesNoDeterministicas = new AplicadorRestriccionesNoDeterministicas(this->contexto);
};

PlanDeCarrera* GeneradorPlanDeCarrera::GenerarPlan(ActualizadorPantallaCommand* actualizadorPantalla)
{
	actualizadorPantalla->Escribir(INFO_CALCULANDO_CORRELATIVIDADES_MATERIAS);
	
	list<MateriaPriorizada*> materiasPriorizadasSegunCorrelatividades = this->priorizadorMaterias->PriorizarMaterias();
	materiasPriorizadasSegunCorrelatividades.sort(ComparadorPorPrioridad());

	actualizadorPantalla->Escribir(INFO_APLICANDO_RESTRICCIONES);
	
	PlanDeCarrera* planDeCarrera = new PlanDeCarrera(materiasPriorizadasSegunCorrelatividades, this->contexto);
	this->aplicadorRestriccionesDeterministicas->AplicarRestriccionesDeterministicas(planDeCarrera);
	this->aplicadorRestriccionesNoDeterministicas->AplicarRestriccionesNoDeterministicas(planDeCarrera, actualizadorPantalla);

	actualizadorPantalla->Escribir(INFO_CONSTRUYENDO_PLAN);

	planDeCarrera->ConstruirPeriodosBajoRestriccionesProcesadas(actualizadorPantalla);

	actualizadorPantalla->Escribir(INFO_PLAN_CONSTRUIDO);

	return planDeCarrera;
};